在 FreeBSD 上使用 Wireguard 和 VXLAN 实现跨 VPS 的网络桥接
在当今互联的世界中,系统管理员经常需要在多个虚拟专用服务器(VPS)上管理服务。本文介绍了一种高级网络设置,使用 Wireguard 和 VXLAN 在 FreeBSD 系统上连接两个 VPS 实例的网络。当需要在不同提供商之间分配服务或利用多个托管环境的优势时,这种配置特别有用。
背 景
在 BSD Cafe,我们使用各种 VPS 实例来提供服务。主要有两个:
- 一个公开可访问的 VPS,负责运行反向代理和所有包路由的防火墙规则。
- 一个托管在我自己物理主机上的较大 VPS,它不直接暴露于互联网,也没有公共 IP 地址。
大多数 BSD Cafe 服务的 jails 分布在这两个 VPS 实例之间。有时,我需要在它们之间迁移服务,以便提高性能或更有效地管理更新。
为了实现这种灵活性,我一直在每个 VPS 上配置一个网桥。最初,我使用 Zerotier 来连接这些网桥,使它们能够像一个大型网络一样通信。
新设置:Wireguard 和 VXLAN
尽管 Zerotier 的方案有效,但我决定改用 Wireguard 和 VXLAN,这种方案更精简,原因如下:
- 性能:Wireguard 性能优异,开销低。
- 简洁性:配置简单,易于维护。
- 安全性:Wireguard 提供强大、现代的加密技术。
最初,我就已经在两个服务器之间建立了 Wireguard 连接。因只有一个服务器是公开访问的,我将它设置为只接受连接,另一个服务器则直接连接到该服务器的公共 IP,并设置了 20 秒的 keepalive(由于两个服务器之间的高流量,一般无需 keepalive)。
为了完成这个设置,我在各 VPS 上添加了两个 VXLAN 接口,并将这些接口添加到本地网桥中,包即时在网络间开始传输。
整体网络拓扑
步骤实施
请按照以下步骤,在 FreeBSD 上使用 Wireguard 和 VXLAN 连接两个不同的网络。虽然我在 BSD Cafe 用这个设置来连接 jails,但你可以用它来实现很多用途,比如在不同提供商之间连接各种 VM(bhyve)实例。
必要条件
Wireguard 现在已经集成在 FreeBSD 中,所以你不再需要自己编译模块或使用 Go 版本。然而,我们将使用 “wireguard-tools” 脚本,因为它们提供了非常实用的 “wg-quick” 命令。
首先在两台服务器上安装 wireguard-tools 软件包:
pkg install wireguard-tools
配置指南
Server 1 (公网 IP)
- 生成 Wireguard 的密钥对:
wg genkey | tee /dev/stderr | wg pubkey | grep --label PUBLIC -H .
这条命令会生成一对私钥和公钥。请记下公钥,因为配置客户端时会用到它。
我们再添加一个 PSK(预共享密钥);虽然是可选的,但添加后可以提升整个系统的安全性。
wg genpsk
- 创建一个名为
/usr/local/etc/wireguard/wg0.conf
的新文件:
[Interface]
## Default port is 51820 - feel free to change it
PrivateKey = <the private key from the previous command>
ListenPort = 43671
Address = 10.77.0.1/24
PostUp = /sbin/ifconfig vxlan create vxlanid 42 vxlanlocal 10.77.0.1 vxlanremote 10.77.0.2 inet 10.77.1.1/24
PostUp = /sbin/ifconfig bridge0 addm vxlan0 up
PostDown = /sbin/ifconfig vxlan0 destroy
[Peer]
PublicKey = <the other peer's public key>
AllowedIPs = 10.77.0.2/32
PresharedKey = <the PSK from the previous command>
- 修改
/etc/rc.conf
并添加:
wireguard_interfaces="wg0"
wireguard_enable="YES"
- 启动 Wireguard 和 VXLAN 端点:
wg-quick up wg0
Server 2 (NAT 背后)
- 像之前一样生成 Wireguard 密钥。
- 创建配置文件
/usr/local/etc/wireguard/wg0.conf
:
[Interface]
PrivateKey = <the private key from the previous command>
Address = 10.77.0.2/24
PostUp = /sbin/ifconfig vxlan create vxlanid 42 vxlanlocal 10.77.0.2 vxlanremote 10.77.0.1 inet 10.77.1.2/24
PostUp = /sbin/ifconfig bridge0 addm vxlan0 up
PostDown = /sbin/ifconfig vxlan0 destroy
[Peer]
PublicKey = <the other peer's public key>
AllowedIPs = 10.77.0.1/32
PresharedKey = <the PSK from the previous command>
Endpoint = <public_ip>:<port>
PersistentKeepalive = 20
- 按之前的说明修改
/etc/rc.conf
文件。 - 启动 Wireguard 和 VXLAN 端点:
wg-quick up wg0
验证连接
要检查连接是否建立,可以在任一主机上运行 wg
命令。此命令会显示连接状态、最近一次握手时间,以及数据传输情况。
你还可以尝试 ping 另一个主机的 Wireguard 和 VXLan 接口 IP 地址(例如 10.77.0.1、10.77.0.2,或 10.77.1.1、10.77.1.2)。
VXLAN 配置细节
总 结
这种设置允许将两个 VXLAN 接口插入本地桥,通过 Wireguard 实现数据包的转发。这可以在两个主机之间畅通无阻地传递数据,实际上在你的 VPS 实例之间创建了一个统一的网络。
这种配置特别适用于:
- 将服务分散在不同的服务提供商上
- 同时利用公共和私有的 VPS 实例
- 创建灵活且可扩展的网络架构
使用 Wireguard 和 VXLAN,可以享受到强大的加密、高效的性能,并能在物理分离的服务器之间创建复杂的网络拓扑。
请记住,始终保持系统更新,并定期检查网络配置,以确保其符合不断变化的需求和安全要求。